package com.king.designpatterns.结构型模式.代理模式;

/**
 * 代理模式（Proxy Pattern）也叫委托模式，是一个使用率非常高的模式。
 *
 * 定义：为其他对象提供一种代理以控制对这个对象的访问。
 *
 * 角色：
 *      ■ 抽象主题（Subject）角色：
 *          该角色是真实主题和代理主题的共同接口，以便在任何可以使用真实主题的地方都可以使用代理主题。
 *      ■ 代理主题（Proxy Subject）角色：
 *          也叫做委托类、代理类，该角色负责控制对真实主题的引用，负责在需要的时候创建或删除真实主题对象，并且在真实主题角色处理完毕前后做预处理和善后处理工作。
 *      ■ 真实主题（Real Subject）角色：
 *          该角色也叫做被委托角色、被代理角色，是业务逻辑的具体执行者。
 *
 * 种类：
 *      ■ 远程（Remote）代理：为一个位于不同的地址空间的对象提供一个局部代表对象。这个不同的地址空间可以是在本机器中，也可以在另一台机器中。
 *      ■ 虚拟（Virtual）代理：有时需要创建一些消耗较多资源的对象，可以首先创建代理对象，而将真实对象的创建延迟。例如，加载一个很大的图片，可以通过图片的代理来代替真正的图片。
 *      ■ 保护（Protect or Access）代理：控制对一个对象的访问，如果需要，可以给不同的用户提供不同级别的使用权限。
 *      ■ 缓存（Cache）代理：为某一个目标操作的结果提供临时的存储空间，以便多个客户端可以共享这些结果。
 *      ■ 同步（Synchronization）代理：使几个用户能够同时使用一个对象而没有冲突。
 *      ■ 智能引用（Smart Reference）代理：当一个对象被引用时，提供一些额外的操作，例如，记录访问的流量和次数等。
 *
 * 优点：
 *      ■ 职责清晰：真实的角色实现实际的业务逻辑，不用关心其他非本职的事务，通过后期的代理完成附加的事务，附带的结果就是编程简洁清晰。
 *      ■ 高扩展性：具体主题角色随需求不同可能有很多种，但只要实现了接口，代理类就完全可以在不做任何修改的情况下代理各种真实主题角色。
 *      ■ 智能化：代理类可以在运行时才确定需要去代理的真实主题，这是一种强大的功能。
 *
 * @author king
 * @date 2021-06-08 10:36
 */
public class ProxyPattern {
    public static void main(String[] args) {
        IGamePlayer player = new GamePlayer("李逍遥");
        IGamePlayer proxy = new GamePlayerProxy(player);
        proxy.killBoss();
        proxy.upgrade();
    }
}
